package org.gao.gift.service.impl;

import org.gao.gift.dto.PhoneCodeDto;
import org.gao.gift.service.ICommonService;
import org.gao.gift.util.StrUtils;
import org.gao.gift.util.VerifyCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

@Service
public class CommonServiceImpl implements ICommonService {

    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    @Override
    public String createImgCode(String uuid) {
        //1.生成图形验证码里面的数字
        String code = StrUtils.getRandomString(4);
        //2.把数字和uuid组合放到redis里面  5分钟自动过期
        redisTemplate.opsForValue().set(uuid,code,5, TimeUnit.MINUTES);
        //3.要把数字转换成一张图片(GUI)
        try {
            return VerifyCodeUtils.verifyCode(102, 42, code);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //4.返回一张图片
        return null;
    }

    /*
        1.验证图形验证码
        2.生成手机验证码
        3.把验证码发送到用户的手机上
        4.1分钟内不能发送两次
          存储到redis的时候 存储发送的时间
        5.网络延迟问题:多次发送验证码 用户怎么使用
            方案1:两次发送验证码是同一个 -->等会就使用这种方案
            方案2:发送两个不同的验证码,输入其中的任意一个都OK -->redis里面使用list存储
        6.一个系统发送验证码的位置有多个,不同功能的验证码能不能再一分钟内发送两个
            redis存储数据的时候添加上一个用于去区分功能的前缀
            key  前缀:手机号



     */
    @Override
    public void sendPhoneCode(PhoneCodeDto phoneCodeDto) {
        //组装redis存储在redis的key
        String key = phoneCodeDto.getType()+":"+phoneCodeDto.getPhone();
        String code = StrUtils.getRandomString(6);

        /*
        if (phoneCodeDto.getType().equals("REG")) {

            // 1.验证图形验证码
            Object o = redisTemplate.opsForValue().get(phoneCodeDto.getUuid());
            RonghuaAssert.isNotNull(o, SystemErrorCode.RESPONSE_CODE_500002);
            //2.比较是否正确
            RonghuaAssert.isEq(phoneCodeDto.getImgCode(),o.toString(),SystemErrorCode.RESPONSE_CODE_500002);
        }
        */
        //根据用户的手机号获取验证码
        Object codeInRedis = redisTemplate.opsForValue().get(key);
        if (codeInRedis!=null){
           //获取上一次的发送时间
            Long preTime = Long.valueOf(codeInRedis.toString().split(":")[1]);
            if ((System.currentTimeMillis()-preTime)<60*1000){
                //throw new BusinessException(SystemErrorCode.RESPONSE_CODE_500003);
                throw new RuntimeException("请勿频繁发送");
            }
            //重置code
            code=codeInRedis.toString().split(":")[0];
        }



        //4.把验证码存储在redis里面
        /*
                    key                       value
                 REG:15008495702             188188:1655641166
                 BIND:15008495702             验证码:时间戳
         */
        redisTemplate.opsForValue().set(key,code+":"+System.currentTimeMillis(),5,TimeUnit.MINUTES);
        //把验证码发送到用户的手机上
        //boolean b = SmsUtils.sendMsg(phoneCodeDto.getPhone(), code);
        System.out.println("本次的验证码为:"+code);

    }
}
